package org.shj.pattern.visitor;

/**
 * 访问者模式：
 * 意图： 主要将数据结构与数据操作分离
 * 主要解决： 稳定的数据结构和易变的操作耦合的问题
 * 何时使用： 需要对一个对象结构中的对象进行很多不同的并且不相关的操作，而需要避免这些操作“污染”这些对象的类。
 * 优点： 1. 符合单一职责原则，  2. 优秀的扩展性（对数据操作而言）  3. 灵活性
 * 缺点： 1. 具体元素对访问者公布细节，违反了迪米特原则  2. 具体元素变更比较困难。  3. 依赖了具体类，没有依赖抽象
 */
public class Main {

	public static void main(String[] args) {
		ObjectStructure o = new ObjectStructure();

		o.attach(new ConcreteElementA());
		o.attach(new ConcreteElementB());
		
		ConcreteVisitorA va = new ConcreteVisitorA();
		ConcreteVisitorB vb = new ConcreteVisitorB();
		
		o.accept(va);
		o.accept(vb);
	}

}
